#pragma once

#include <memory>
#include <unordered_map>
#include <boost/asio.hpp>
#include <boost/beast.hpp>
#include "../network/websocket_server.hpp"
#include "message_receiver.hpp"
#include "../common/logger.hpp"
#include "protocol_handler.hpp"
#include <nlohmann/json.hpp>

/**
 * @brief 游戏服务器类
 * 
 * 管理所有游戏会话和业务逻辑
 */
class GameServer : public IMessageReceiver {
public:

    /**
     * @brief 构造函数
     * @param io_context IO上下文
     * @param address 服务器地址
     * @param port 服务器端口
     */
    GameServer(boost::asio::io_context& io_context, 
              const std::string& address, 
              unsigned short port);

    /**
     * @brief 启动服务器
     */
    void start();

    /**
     * @brief 停止服务器
     */
    void stop();

    /**
     * @brief 处理接收到的消息
     * @param data 接收到的二进制数据
     * @param session_id 会话ID
     */
    void handle_message(const std::vector<uint8_t>& data, uint32_t session_id) override;

    /**
     * @brief 注册协议
     * @param protocol_name 协议名称
     * @param protocol 协议实例
     */
    void register_protocol(const std::string& protocol_name, std::shared_ptr<IProtocolHandler> protocol);

    /**
     * @brief 发送消息
     * @param session_id 会话ID
     * @param message 消息
     */
    void send_message(uint32_t session_id, const nlohmann::json& message);
private:
    // /**
    //  * @brief 处理新连接
    //  * @param socket 新连接的套接字
    //  */
    // void handle_new_connection(std::shared_ptr<TcpSession> session);

    // /**
    //  * @brief 处理会话关闭
    //  * @param session_id 会话ID
    //  */
    // void handle_session_closed(uint32_t session_id);
    std::unique_ptr<MessageHandler> message_handler_;
    boost::asio::io_context& io_context_;
    std::unique_ptr<WebSocketServer> websocket_server_;
}; 